(function ($) {
    var tMajorAutoComplete = new function () {
        this.currentInputText = null;//目前获得光标的输入框（解决一个页面多个输入框绑定自动补全功能）
        this.functionalKeyArray = [9, 20, 13, 16, 17, 18, 91, 92, 93, 45, 36, 33, 34, 35, 37, 39, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 144, 19, 145, 40, 38, 27];//键盘上功能键键值数组
        this.holdText = null;//输入框中原始输入的内容

        function guid() {
            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                var r = Math.random() * 16 | 0,
                    v = c == 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
            });
        }

        //初始化插入自动补全div，并在document注册mousedown，点击非div区域隐藏div
        var id = guid();
        // console.log(id);
        this.init = function () {
            $("body").append("<div id=" + id + " class='bigautocomplete-layout'></div>");
            $(document).bind('mousedown', function (event) {
                // var $target = $(event.target);
                // if ((!($target.is('#bigAutocompleteContent'))) && (!$target.is(tMajorAutoComplete.currentInputText))) {
                //     tMajorAutoComplete.hideAutocomplete();
                // }
            })

            //鼠标悬停时选中当前行
            $("#" + id).delegate("tr", "mouseover", function () {
                $("#" + id + " tr").removeClass("ct");
                $(this).addClass("ct");
            }).delegate("tr", "mouseout", function () {
                $("#" + id + " tr").removeClass("ct");
            });


            //单击选中行后，选中行内容设置到输入框中，并执行callback函数
            $("#" + id).delegate("tr", "click", function () {
                tMajorAutoComplete.currentInputText.val($(this).find("div:last").html());
                var callback_ = tMajorAutoComplete.currentInputText.data("config").callback;
                if ($("#" + id).css("display") != "none" && callback_ && $.isFunction(callback_)) {
                    callback_($(this).find(".ct").data("jsonData"));
                }
                tMajorAutoComplete.hideAutocomplete();
            })

        }

        this.autocomplete = function (param) {

            if ($("body").length > 0 && $("#" + id).length <= 0) {
                tMajorAutoComplete.init();//初始化信息
            }

            var $this = $(this);//为绑定自动补全功能的输入框jquery对象

            var $bigAutocompleteContent = $("#" + id);

            this.config = {
                id: null,
                //width:下拉框的宽度，默认使用输入框宽度
                width: $this.outerWidth() - 2,
                //url：格式url:""用来ajax后台获取数据，返回的数据格式为data参数一样
                url: null,
                /*data：格式{data:[{title:null,result:{}},{title:null,result:{}}]}
                url和data参数只有一个生效，data优先*/
                data: null,
                //callback：选中行后按回车或单击时回调的函数
                callback: null
            };
            $.extend(this.config, param);
            $this.data("config", this.config);

            //输入框keydown事件
            $this.keydown(function (event) {
                switch (event.keyCode) {
                    case 40://向下键

                        if ($bigAutocompleteContent.css("display") == "none") return;

                        var $nextSiblingTr = $bigAutocompleteContent.find(".ct");
                        if ($nextSiblingTr.length <= 0) {//没有选中行时，选中第一行
                            $nextSiblingTr = $bigAutocompleteContent.find("tr:first");
                        } else {
                            $nextSiblingTr = $nextSiblingTr.next();
                        }
                        $bigAutocompleteContent.find("tr").removeClass("ct");

                        if ($nextSiblingTr.length > 0) {//有下一行时（不是最后一行）
                            $nextSiblingTr.addClass("ct");//选中的行加背景
                            $this.val($nextSiblingTr.find("div:last").html());//选中行内容设置到输入框中

                            //div滚动到选中的行,jquery-1.6.1 $nextSiblingTr.offset().top 有bug，数值有问题
                            $bigAutocompleteContent.scrollTop($nextSiblingTr[0].offsetTop - $bigAutocompleteContent.height() + $nextSiblingTr.height());

                        } else {
                            $this.val(tMajorAutoComplete.holdText);//输入框显示用户原始输入的值
                        }


                        break;
                    case 38://向上键
                        if ($bigAutocompleteContent.css("display") == "none") return;

                        var $previousSiblingTr = $bigAutocompleteContent.find(".ct");
                        if ($previousSiblingTr.length <= 0) {//没有选中行时，选中最后一行行
                            $previousSiblingTr = $bigAutocompleteContent.find("tr:last");
                        } else {
                            $previousSiblingTr = $previousSiblingTr.prev();
                        }
                        $bigAutocompleteContent.find("tr").removeClass("ct");

                        if ($previousSiblingTr.length > 0) {//有上一行时（不是第一行）
                            $previousSiblingTr.addClass("ct");//选中的行加背景
                            $this.val($previousSiblingTr.find("div:last").html());//选中行内容设置到输入框中

                            //div滚动到选中的行,jquery-1.6.1 $$previousSiblingTr.offset().top 有bug，数值有问题
                            $bigAutocompleteContent.scrollTop($previousSiblingTr[0].offsetTop - $bigAutocompleteContent.height() + $previousSiblingTr.height());
                        } else {
                            $this.val(tMajorAutoComplete.holdText);//输入框显示用户原始输入的值
                        }

                        break;
                    case 27://ESC键隐藏下拉框

                        tMajorAutoComplete.hideAutocomplete();
                        break;
                }
            });

            //输入框keyup事件
            $this.keyup(function (event) {
                var k = event.keyCode;
                var ctrl = event.ctrlKey;
                var isFunctionalKey = false;//按下的键是否是功能键
                for (var i = 0; i < tMajorAutoComplete.functionalKeyArray.length; i++) {
                    if (k == tMajorAutoComplete.functionalKeyArray[i]) {
                        isFunctionalKey = true;
                        break;
                    }
                }
                //k键值不是功能键或是ctrl+c、ctrl+x时才触发自动补全功能
                if (!isFunctionalKey && (!ctrl || (ctrl && k == 67) || (ctrl && k == 88))) {
                    var config = $this.data("config");

                    var offset = $this.offset();
                    $bigAutocompleteContent.width(config.width);
                    var h = $this.outerHeight() - 1;
                    $bigAutocompleteContent.css({"top": offset.top + h, "left": offset.left});

                    var data = config.data;
                    var url = config.url;
                    var keyword_ = $.trim($this.val());
                    if (keyword_ == null || keyword_ == "") {
                        tMajorAutoComplete.hideAutocomplete();
                        return;
                    }
                    if (data != null && $.isArray(data)) {
                        var data_ = new Array();
                        for (var i = 0; i < data.length; i++) {
                            if (data[i].toLowerCase().indexOf(keyword_.toLowerCase()) > -1) {
                                data_.push(data[i]);
                            }
                        }
                        makeContAndShow(data_);
                    } else if (url != null && url != "") {//ajax请求数据
                        $.post(url, {keyword: keyword_}, function (result) {
                            var data_ = new Array();
                            for (var i = 0; i < result.length; i++) {
                                if (result[i].toLowerCase().indexOf(keyword_.toLowerCase()) > -1) {
                                    data_.push(result[i]);
                                }
                            }
                            makeContAndShow(data_);
                        }, "json")
                    }


                    tMajorAutoComplete.holdText = $this.val();
                }
                //回车键
                if (k == 13) {
                    var callback_ = $this.data("config").callback;
                    if ($bigAutocompleteContent.css("display") != "none") {
                        if (callback_ && $.isFunction(callback_)) {
                            callback_($bigAutocompleteContent.find(".ct").data("jsonData"));
                        }
                        $bigAutocompleteContent.hide();
                    }
                }

            });


            //组装下拉框html内容并显示
            function makeContAndShow(data_) {
                if (data_ == null || data_.length <= 0) {
                    return;
                }

                var cont = "<table><tbody>";
                for (var i = 0; i < data_.length; i++) {
                    cont += "<tr><td><div>" + data_[i] + "</div></td></tr>"
                }
                cont += "</tbody></table>";
                $bigAutocompleteContent.html(cont);
                $bigAutocompleteContent.show();

                //每行tr绑定数据，返回给回调函数
                $bigAutocompleteContent.find("tr").each(function (index) {
                    $(this).data("jsonData", data_[index]);
                })
            }


            //输入框focus事件
            $this.focus(function () {
                tMajorAutoComplete.currentInputText = $this;
                $("#" + id).slideDown("slow");
            });
            $this.blur(function () {
                $("#" + id).slideUp("slow");
            });

        }
        //隐藏下拉框
        this.hideAutocomplete = function () {
            var $bigAutocompleteContent = $("#" + id);
            if ($bigAutocompleteContent.css("display") != "none") {
                $bigAutocompleteContent.find("tr").removeClass("ct");
                $bigAutocompleteContent.hide();
            }
        }
    };


    $.fn.tMajorAutoComplete = tMajorAutoComplete.autocomplete;

})(jQuery)